home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1993-12-09 | 9.3 KB | 399 lines |
- IMPLEMENTATION MODULE DosSystem;
- __IMP_SWITCHES__
- __DRIVER__
- #ifdef HM2
- #ifdef __LONG_WHOLE__
- (*$!i+: Modul muss mit $i- uebersetzt werden! *)
- (*$!w+: Modul muss mit $w- uebersetzt werden! *)
- #else
- (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
- (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
- #endif
- #endif
- (*****************************************************************************)
- (* 04-Dez-93, Holger Kleinschmidt *)
- (*****************************************************************************)
-
- VAL_INTRINSIC
- CAST_IMPORT
- OSCALL_IMPORT
-
- FROM SYSTEM IMPORT
- (* TYPE *) ADDRESS,
- (* PROC *) ADR;
-
- FROM PORTAB IMPORT
- (* CONST*) NULL,
- (* TYPE *) SIGNEDWORD, UNSIGNEDWORD, SIGNEDLONG, UNSIGNEDLONG, WORDSET;
-
- FROM OSCALLS IMPORT
- (* PROC *) Pdomain, Supexec, Sversion;
-
- #if (defined LPRM2)
- IMPORT GEMX;
- #elif (defined SPCM2)
- IMPORT GEMDOS;
- #elif (defined MM2)
- IMPORT PrgCtrl;
- #elif (defined HM2)
- IMPORT TOS;
- /*
- #elif (defined HM2_OLD)
- IMPORT System;
- */
- #elif (defined TDIM2)
- IMPORT GEMX;
- #elif (defined FTLM2)
- IMPORT LOADER;
- #endif
-
-
- #define PSHL 2F00H
- #define JSRA0 4E90H
- #define ADDQ4 588FH
- #define CALLSHELL(_CMD,_SHELL)\
- SETREG(0,_CMD);SETREG(8,_SHELL);CODE(PSHL,JSRA0,ADDQ4)
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- TYPE
- ULongPtr = POINTER TO UNSIGNEDLONG;
-
- TYPE
- Cookie = RECORD
- id : UNSIGNEDLONG;
- CASE TAG_COLON UNSIGNEDWORD OF
- 0: lc : UNSIGNEDLONG;
- |1: s1 : WORDSET;
- s2 : WORDSET;
- ELSE
- c1 : UNSIGNEDWORD;
- c2 : UNSIGNEDWORD;
- END;
- END;
-
- CookieRange = [0..1000]; (* beliebig *)
- CookiePtr = POINTER TO ARRAY CookieRange OF Cookie;
- CookiePPtr = POINTER TO CookiePtr;
-
- OsPPtr = POINTER TO OsPtr;
-
- VAR
- mch : MachineType;
- cpu : CPUType;
- fpu : FPUType;
- linef : UNSIGNEDWORD;
- STARTTIME : UNSIGNEDLONG;
- MiNT : CARDINAL;
- FLK : BOOLEAN;
- pcookie : CookiePtr;
- OSP : OsPtr;
- PCookies : CookiePPtr;
- Hz200 : ULongPtr;
- ShellP : ULongPtr;
- Sysbase : OsPPtr;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
- #ifdef HM2
- (*$E+*)
- #endif
- PROCEDURE getpcookies;
- (* Ergebnis ueber Register D0, damit die Prozedur reentrant bleibt *)
- BEGIN
- SETREG(0, PCookies^);
- END getpcookies;
-
- PROCEDURE gethz200;
- BEGIN
- SETREG(0, Hz200^);
- END gethz200;
-
- PROCEDURE getshellp;
- BEGIN
- SETREG(0, ShellP^);
- END getshellp;
-
- PROCEDURE init;
- (* Reentranz unwichtig *)
- BEGIN
- OSP := Sysbase^;
- OSP := OSP^.osBeg;
- pcookie := PCookies^;
- END init;
- #ifdef HM2
- (*$E=*)
- #endif
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- PROCEDURE GetOsHeader ((* -- /AUS *) VAR osp : ADDRESS );
- BEGIN
- osp := OSP;
- END GetOsHeader;
-
- (*--------------------------------------------------------------------------*)
-
- PROCEDURE Machine ( ): MachineType;
- BEGIN
- RETURN(mch);
- END Machine;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE CPU ( ): CPUType;
- BEGIN
- RETURN(cpu);
- END CPU;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE FPU ((* -- /AUS *) VAR info : FPUInfo );
- BEGIN
- info.fpu := fpu;
- info.linef := linef;
- END FPU;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE MiNTVersion ( ): CARDINAL;
- BEGIN
- RETURN(MiNT);
- END MiNTVersion;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE FileLocking ( ): BOOLEAN;
- BEGIN
- RETURN(FLK);
- END FileLocking;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE ProcessDomain ((* EIN/ -- *) dom : INTEGER ): INTEGER;
-
- VAR res : SIGNEDWORD;
-
- BEGIN
- IF MiNT > 0 THEN
- RETURN(Pdomain(dom));
- ELSE
- RETURN(0); (* TOS-Domain *)
- END;
- END ProcessDomain;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE DosVersion ( ): CARDINAL;
- BEGIN
- RETURN(Sversion());
- END DosVersion;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE GetCookie ((* EIN/ -- *) cookie : UNSIGNEDLONG;
- (* -- /AUS *) VAR value : UNSIGNEDLONG ): BOOLEAN;
-
- VAR __REG__ pc : CookiePtr;
- __REG__ i : CookieRange;
-
- BEGIN
- Supexec(getpcookies);
- GETREGADR(0, pc);
- value := 0;
-
- IF pc = NULL THEN
- RETURN(FALSE);
- ELSE
- i := 0;
- WHILE (pc^[i].id <> VAL(UNSIGNEDLONG,0)) AND (pc^[i].id <> cookie) DO
- INC(i );
- END;
- IF pc^[i].id = cookie THEN
- value := pc^[i].lc;
- RETURN(TRUE);
- ELSE
- RETURN(FALSE);
- END;
- END;
- END GetCookie;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE ReadHz200 ( ): UNSIGNEDLONG;
-
- VAR time : UNSIGNEDLONG;
-
- BEGIN
- Supexec(gethz200);
- GETLREG(0, time);
- RETURN(time);
- END ReadHz200;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE SysClock ( ): UNSIGNEDLONG;
- BEGIN
- RETURN(ReadHz200() - STARTTIME);
- END SysClock;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE ShellInstalled ( ): Shell;
-
- CONST GulamMAGIC = 00420135H;
- XBRAID = 58425241H; (* 'XBRA' *)
- MasterID = 4D415354H; (* 'MAST' *)
- MupfelID = 4D555046H; (* 'MUPF' *)
- GeminiID = 474D4E49H; (* 'GMNI' *)
-
- TYPE xbraidp = POINTER TO ARRAY[0..1] OF UNSIGNEDLONG;
- magicp = ULongPtr;
-
- VAR __REG__ xbraid : xbraidp;
- magic : magicp;
- shell : UNSIGNEDLONG;
-
- BEGIN
- Supexec(getshellp);
- GETLREG(0, shell);
-
- IF shell = VAL(UNSIGNEDLONG,0) THEN
- RETURN(None);
- END;
- xbraid := CAST(xbraidp,shell - VAL(UNSIGNEDLONG,12));
- IF xbraid^[0] = XBRAID THEN
- IF xbraid^[1] = MupfelID THEN
- RETURN(Mupfel);
- ELSIF xbraid^[1] = GeminiID THEN
- RETURN(Gemini);
- ELSIF xbraid^[1] = MasterID THEN
- RETURN(Master);
- END;
- END;
- magic := CAST(magicp,shell - VAL(UNSIGNEDLONG,10));
- IF magic^ = GulamMAGIC THEN
- RETURN(Gulam);
- END;
- RETURN(Unknown);
- END ShellInstalled;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE DosPid ((* EIN/ -- *) bp : ADDRESS ): INTEGER;
- BEGIN
- RETURN(INT((CAST(UNSIGNEDLONG,bp) DIV LC(256)) MOD LC(32768)));
- END DosPid;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE CallShell ((* EIN/ -- *) VAR cmd : ARRAY OF CHAR ): INTEGER;
-
- VAR retCode : SIGNEDWORD;
- shell : UNSIGNEDLONG;
-
- BEGIN
- Supexec(getshellp);
- GETLREG(0, shell);
- IF shell = VAL(UNSIGNEDLONG,0) THEN
- RETURN(-1);
- ELSE
- cmd[HIGH(cmd)] := 0C;
- CALLSHELL(ADR(cmd), shell);
- GETSWREG(0,retCode);
- RETURN(INT(retCode));
- END;
- END CallShell;
-
- (*===========================================================================*)
-
- CONST
- MiNTCk = 4D694E54H; (* "MiNT" *)
- FLKCk = 5F464C4BH; (* "_FLK" *)
- MCHCk = 5F4D4348H; (* "_MCH" *)
- CPUCk = 5F435055H; (* "_CPU" *)
- FPUCk = 5F465055H; (* "_FPU" *)
-
- VAR
- bptr : BasePPtr;
- res : INTEGER;
- vers : UNSIGNEDLONG;
- i : CookieRange;
-
- BEGIN (* DosSystem *)
- Sysbase := CAST(OsPPtr,VAL(UNSIGNEDLONG,4F2H));
- PCookies := CAST(CookiePPtr,VAL(UNSIGNEDLONG,5A0H));
- Hz200 := CAST(ULongPtr,VAL(UNSIGNEDLONG,4BAH));
- ShellP := CAST(ULongPtr,VAL(UNSIGNEDLONG,4F6H));
-
- STARTTIME := ReadHz200();
-
- Supexec(init); (* OSP und pcookie setzen *)
-
- #if (defined HM2)
- BASEP := BasePtr(TOS.BasePage);
- #elif (defined LPRM2)
- BASEP := VAL(BasePtr,GEMX.BasePagePtr);
- #elif (defined SPCM2)
- BASEP := VAL(BasePtr,GEMDOS.BasePagePtr);
- #elif (defined MM2)
- PrgCtrl.GetBasePageAddr(BASEP);
- #elif (defined TDIM2)
- BASEP := BasePtr(GEMX.BasePageAddress);
- #elif (defined FTLM2)
- BASEP := BasePtr(LOADER.ProgPrefixAddress);
- #else
- IF VAL(CARDINAL,OSP^.osEntry) >= 0102H THEN
- bptr := OSP^.pRun; (* erst ab Blitter-TOS 1.02 *)
- ELSIF CAST(UNSIGNEDWORD,OSP^.osConf) DIV 2 = 4 THEN
- (* Spanisches TOS 1.0 *)
- bptr := CAST(BasePPtr,VAL(UNSIGNEDLONG,873CH));
- ELSE
- bptr := CAST(BasePPtr,VAL(UNSIGNEDLONG,602CH));
- END;
- BASEP := bptr^;
- #endif
-
- (* Die folgenden Cookies werden nur waehrend der Initialisierung getestet,
- * da sich deren Inhalt nicht waehrend des Programmlaufs aendert.
- * (Bei _FLK bin ich mir allerdings nicht ganz sicher.)
- *)
- MiNT := 0;
- mch := atariST;
- cpu := CPU68000;
- fpu := FPUType{};
- linef := 0;
- FLK := FALSE;
- IF pcookie <> NULL THEN
- i := 0;
- WHILE pcookie^[i].id <> LC(0) DO
- WITH pcookie^[i] DO
- IF id = MiNTCk THEN
- MiNT := VAL(CARDINAL,c2);
- res := Pdomain(1);
- ELSIF id = FLKCk THEN
- FLK := TRUE;
- ELSIF id = MCHCk THEN
- IF c1 <= 3 THEN
- mch := VAL(MachineType,c1);
- ELSE
- mch := atari;
- END;
- ELSIF id = CPUCk THEN
- IF c2 <= 40 THEN
- cpu := VAL(CPUType,c2 DIV 10);
- ELSE
- cpu := CPU68XXX;
- END;
- ELSIF id = FPUCk THEN
- #ifdef HM2
- fpu := CAST(FPUType,CHR(c1));
- #else
- fpu := CAST(FPUType,c1);
- #endif
- linef := c2;
- END;
- END;
- INC(i);
- END;
- END;
- END DosSystem.
-